classdef ImageCropper < handle
    properties
        crop_width          % 裁剪宽度
        reference_right_edge % 参考右边缘位置
    end
    
    methods
        function right_edge = find_right_edge(obj, binary_img)
            % 垂直投影计算（MATLAB矩阵运算优化）
            projection = sum(binary_img, 1);
            
            % 高斯滤波去噪（使用内置imgaussfilt替代手工卷积）
            smoothed = imgaussfilt(projection, 15/6); % 标准差=窗口尺寸/6
            
            % 梯度计算（使用内置梯度函数）
            gradient = gradient(smoothed);
            
            % 从右向左扫描边缘
            threshold = 2 * std(gradient);
            for i = length(gradient):-1:1
                if abs(gradient(i)) > threshold
                    % 局部区域优化（使用矩阵运算替代循环）
                    local_region = gradient(max(1,i-5):min(length(gradient),i+5));
                    [~, local_offset] = max(abs(local_region));
                    right_edge = i - 6 + local_offset;
                    return;
                end
            end
            right_edge = [];
        end
        
        function initialize_with_reference(obj, reference_img)
            % 使用MATLAB内置函数处理图像
            gray = rgb2gray(reference_img);
            gray = adapthisteq(gray); % 对比度受限自适应直方图均衡化
            
            % 边缘检测优化（使用Canny算法替代手工实现）
            binary = edge(gray, 'Canny', [0.1 0.2], 'vertical');
            
            % 寻找右边缘
            obj.reference_right_edge = obj.find_right_edge(binary);
            if ~isempty(obj.reference_right_edge)
                obj.crop_width = obj.reference_right_edge - 100; % 动态调整裁剪宽度
            end
        end
        
        function cropped = crop_image(obj, img)
            if isempty(obj.crop_width)
                cropped = img;
                return;
            end
            
            % 图像预处理优化
            gray = rgb2gray(img);
            gray = adapthisteq(gray);
            binary = edge(gray, 'Canny', [0.1 0.2], 'vertical');
            
            current_right_edge = obj.find_right_edge(binary);
            if isempty(current_right_edge)
                cropped = img;
                return;
            end
            
            % 动态计算裁剪区域
            start_x = max(1, current_right_edge - obj.crop_width);
            end_x = current_right_edge;
            cropped = img(:, start_x:end_x, :);
        end
    end
end

function process_images_to_video(input_path, output_path, sample_count)
    % 初始化并行池（自动检测核心数）
    if isempty(gcp('nocreate'))
        parpool('local');
    end
    
    % 获取BMP文件列表（使用dir提高性能）
    file_list = dir(fullfile(input_path, '*.bmp'));
    if isempty(file_list)
        error('在 %s 中没有找到BMP文件', input_path);
    end
    total_images = length(file_list);
    step = max(1, floor(total_images / sample_count));
    
    % 读取参考帧
    first_img = imread(fullfile(input_path, file_list(1).name));
    cropper = ImageCropper();
    cropper.initialize_with_reference(first_img);
    
    % 预计算文件路径（优化内存访问）
    selected_files = file_list(1:step:end);
    num_files = length(selected_files);
    
    % 预分配内存（提升性能）
    processed_frames = cell(1, num_files);
    
    % 并行处理循环（使用parfor替代Pool）
    parfor i = 1:num_files
        try
            % 读取图像（使用MATLAB内置函数）
            img = imread(fullfile(input_path, selected_files(i).name));
            
            % 裁剪处理
            processed_frames{i} = cropper.crop_image(img);
        catch ME
            warning('处理文件 %s 失败: %s', selected_files(i).name, ME.message);
            processed_frames{i} = [];
        end
    end
    
    % 过滤无效帧
    valid_frames = processed_frames(~cellfun(@isempty, processed_frames));
    if isempty(valid_frames)
        error('没有成功处理任何图片');
    end
    
    % 创建视频文件（使用MPEG-4编码优化）
    v = VideoWriter(output_path, 'MPEG-4');
    v.FrameRate = 30;
    open(v);
    
    % 添加进度条（使用MATLAB内置waitbar）
    h = waitbar(0, '正在写入视频...');
    for i = 1:length(valid_frames)
        writeVideo(v, valid_frames{i});
        waitbar(i/length(valid_frames), h);
    end
    close(h);
    close(v);
    
    disp('视频生成完成！');
end

% 主程序（路径保持与Python版本一致）
input_path = 'F:\李双成\B-1\200-4';
output_path = 'F:\test\output_video_stabilized.mp4';
process_images_to_video(input_path, output_path, 4000);